将函数声明为外部函数,并在 MATLAB 中执行它 您所在的位置:网站首页 simulink not 将函数声明为外部函数,并在 MATLAB 中执行它

将函数声明为外部函数,并在 MATLAB 中执行它

2024-05-19 01:34| 来源: 网络整理| 查看: 265

打开实时脚本

如果您调用返回常量值的外部函数,则可以指示代码生成器在编译时使用 coder.const 计算外部函数。代码生成器随后将在生成的代码中使用此常量。您可以使用此编码模式来生成使用外部函数输出的独立代码。

定义入口函数 rotate_complex,,该函数通过输入参数 theta 旋转文件 complex.xml 中的复数。函数 rotate_complex 调用另一个局部函数 xml2struct,,后者使用用于 XML 处理的 MATLAB API,将文件 complex.xml 中的 XML 格式数字转换为结构体。由于代码生成不支持用于 XML 处理的 MATLAB API,您必须在函数 rotate_complex 的主体中将 xml2struct 函数声明为外部函数。通过将 xml2struct 声明为外部函数,您可以指示代码生成器不为 xml2struct 生成代码。在这种情况下,代码生成器会将 xml2struct 调度给 MATLAB 来执行。但是,由于 complex.xml 在代码生成时间和运行时间之间不会更改,因此,您可以使用 coder.const 指示代码生成器将外部函数 xml2struct 的输出视为运行时常量。由于外部函数在代码生成时间是常量折叠的,因此,您不需要将 xml2struct 的输出显式转换为已知类型。

检查支持文件 complex.xml,该文件中包含复数的实部和虚部。

type complex.xml

定义函数 xml2struct,该函数使用用于 XML 处理的 MATLAB API 读取传递的 XML 文件,将 XML 参数名称和值存储为结构体字段,并返回结构体。

type xml2struct.mfunction s = xml2struct(file) s = struct(); import matlab.io.xml.dom.* doc = parseFile(Parser,file); els = doc.getElementsByTagName("params"); for i = 0:els.getLength-1 it = els.item(i); ps = it.getElementsByTagName("param"); for j = 0:ps.getLength-1 param = ps.item(j); paramName = char(param.getAttribute("name")); paramValue = char(param.getAttribute("value")); paramValue = evalin("base", paramValue); s.(paramName) = paramValue; end end

定义 MATLAB 入口函数 rotate_complex,,该函数使用 xml2struct 将 complex.xml 转换为结构体。然后,函数 rotate_complex 将复数旋转一定角度(该角度等于输入参数 theta 的度数),并返回得到的复数。在此函数中,您可以使用 coder.extrinsic 指令将 xml2struct 函数声明为外部函数,并使用 coder.const 指令对其输出进行常量折叠。

type rotate_complex.mfunction y = rotate_complex(theta) %#codegen coder.extrinsic("xml2struct"); s = coder.const(xml2struct("complex.xml")); comp = s.real + 1i * s.imaginary; magnitude = abs(comp); phase = angle(comp) + deg2rad(theta); y = magnitude * cos(phase) + 1i * sin(phase); end

使用 codegen (MATLAB Coder) 命令为 rotate_complex 生成静态库。将输入类型指定为 double 标量。

codegen -config:lib rotate_complex -args {0} -report Warning: Code generation is using a coder.EmbeddedCodeConfig object. Because Embedded Coder is not installed, this might cause some Embedded Coder features to fail. Code generation successful (with warnings): To view the report, open('codegen/lib/rotate_complex/html/report.mldatx')

检查生成的 C++ 文件 rotate_complex.c。注意 xml2struct 函数的输出硬编码在生成的代码中。

type codegen/lib/rotate_complex/rotate_complex.c/* * File: rotate_complex.c * * MATLAB Coder version : 23.2 * C/C++ source code generated on : 14-Aug-2023 19:19:45 */ /* Include Files */ #include "rotate_complex.h" #include /* Function Definitions */ /* * Arguments : double theta * Return Type : creal_T */ creal_T rotate_complex(double theta) { creal_T y; double y_tmp; y_tmp = 0.017453292519943295 * theta + 0.92729521800161219; y.re = 5.0 * cos(y_tmp); y.im = sin(y_tmp); return y; } /* * File trailer for rotate_complex.c * * [EOF] */


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有